package service;

import java.util.ArrayList;
import java.util.List;

import persistencia.AdministradorPersistencia;
import persistencia.dao.ListaPreciosDAO;
import bean.Fabricante;
import bean.ListaPrecios;
import bean.Pais;
import bean.Producto;
import bean.Proveedor;
import bean.Rodamiento;
import bean.VOList;
import bean.vo.ItemListaPreciosVO;
import bean.vo.ListaPreciosVO;
import bean.vo.ProductoVO;
import bean.vo.RodamientoVO;

@SuppressWarnings({"unchecked"})
public class ServiciosListaPrecios {

	protected static ListaPrecios buscarListaPrecios (String cuitProveedor, Integer nroLista) throws Exception {
		Proveedor prov = ServiciosProveedor.buscarProveedor(cuitProveedor);
		if (prov == null)
			throw new Exception("Error - no existe proveedor con el cuit ingresado");
		
		ListaPrecios lista = (ListaPrecios) SistemaCVR.getInstancia().buscarEntidad(new ListaPrecios(prov, nroLista));
		return lista;
	}
	
	public static ListaPreciosVO buscarListaPrecios (ListaPreciosVO lp) throws Exception {
		ListaPrecios lista = ServiciosListaPrecios.buscarListaPrecios(lp.getProveedor().getCuit(), lp.getNumeroLista());
		return lista != null ? lista.getVO() : null;
	}
	
	public static ArrayList <ListaPreciosVO> getListaPrecios() throws Exception{
		return new VOList<ListaPreciosVO>().getVoList(SistemaCVR.getInstancia().getEntidades(ListaPrecios.class.getName()));
	}
	
	public static void crearListaPrecios(ListaPreciosVO lp, Integer nroListaReemplazada) throws Exception{
		Proveedor prov = ServiciosProveedor.buscarProveedor(lp.getProveedor().getCuit());
		
		if (ServiciosListaPrecios.buscarListaPrecios(lp) == null) {
			ListaPrecios nuevaLista = new ListaPrecios(prov, lp.getNumeroLista(), lp.getFechaEmision(), lp.getFechaCaducidad(), lp.isListaDeOfertas());
			
			for (ItemListaPreciosVO item : lp.getItemsListaPrecio()) {
				String codigoRodamiento = item.getProducto().getRodamiento().getCodigo();
				String sufijoRodamiento = item.getProducto().getRodamiento().getSufijo(); 
				String paisOrigen = item.getProducto().getOrigen().getNombre(); 
				String fabricante = item.getProducto().getFabricante().getNombre();
				
				Producto producto = null;
				try {
					producto = ServiciosProducto.buscarProducto(codigoRodamiento, sufijoRodamiento, paisOrigen, fabricante);
				} catch (Exception e) {
				}
						
				if (producto == null){
					
					Fabricante f = ServiciosFabricante.buscarFabricante(fabricante);
					Pais po = ServiciosPais.buscarPais(paisOrigen);
					Rodamiento r = ServiciosRodamiento.buscarRodamiento(codigoRodamiento, sufijoRodamiento);
					
					if (f == null) {
						f = new Fabricante(fabricante);
						SistemaCVR.getInstancia().agregarEntidad(f);
					}
				
					if (po == null) {
						po = new Pais(paisOrigen);
						SistemaCVR.getInstancia().agregarEntidad(po);
					}
					
					if (r == null) {
						r = new Rodamiento(codigoRodamiento, sufijoRodamiento);
						SistemaCVR.getInstancia().agregarEntidad(r);
					}
					
					producto = new Producto(r, po, f);
					SistemaCVR.getInstancia().agregarEntidad(producto);
				}
				
				nuevaLista.agregarItem(producto, item.getPrecio(), item.getCantidadMinima() != null? item.getCantidadMinima() : 0);
			}
			
			SistemaCVR.getInstancia().agregarEntidad(nuevaLista);
			
			//Desactivo la lista que fue reemplazada por la nueva lista (si existe)
			if (nroListaReemplazada != null)
			{
				ListaPrecios listaAnterior = ServiciosListaPrecios.buscarListaPrecios(lp.getProveedor().getCuit(), nroListaReemplazada);
				if(listaAnterior != null)
				{
					listaAnterior.setActiva(false);
					AdministradorPersistencia.getInstancia().persistir(listaAnterior);
				}
			}
		} else {
			throw new Exception("ERROR - Ya existe una lista de precios para el proveedor/numero de lista ingresados.");	
		}
	}
	
	public static List<ItemListaPreciosVO> obtenerComparativaDePrecios(ProductoVO producto) {
		return new VOList<ItemListaPreciosVO>().getVoList(new ListaPreciosDAO().obtenerComparativaDePrecios(producto));
	}
}
